/***************************************************************************************************
  *Copyright(C),2010-2017,Sumscope
  *FileName	:  pinyin_search.h
  *Author	:  scofined.qi
  *Version	:  1.0
  *Date		:  2017/06/04
  *Desc		:  //用于主要说明此程序文件完成的主要功能
  *Relation :  
  *Others	:  //其他内容说明
  *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
  *History	:  //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
***************************************************************************************************/
#pragma once

#include "../core.h"
#include "./pinyin/pinyin_search_define.h"

namespace internal{
	class BondChangeBuffer;
}
namespace qb{
	namespace base{
		enum kChangeType{
			kChangeTypeNone,
			kChangeTypeName,		// 包含拼音,拼音需要自动计算
			kChangeTypeCode,		// Code,代码
			kChangeTypeNameOnly,	// 只有名称,拼音通过外面传递
			kChangeTypePinyin,		// 简拼
			kChangeTypePinyinFull,	// 全拼
			kChangeTypeNameEn,		// 英文简称
			kChangeTypeCount,
		};
        class S_CORE_EXPORT SpellSearch{
		public:
			
            class S_CORE_EXPORT Collector{
				void*		m_buffer;
				int			m_count;
				bool		m_build;
				bool		m_diskless;
			public:
				Collector(bool build=false);
				~Collector();
				void SetDiskless(bool diskless){ m_diskless = diskless; }
				void SetBuild(bool build){ m_build = build; }
				void AddNameChange(int id, const char* oldName, int oldlen, const char* name, int len);
				void AddNameEnChange(int id, const char* oldName, int oldlen, const char* name, int len);
				void AddCodeChange(int id, const char* oldCode, int oldlen, const char* code, int len);
				void AddChange(int id, int type, const char* oldName,int oldlen, const char* name,int len);
				void Commit();
				int  GetCount()const{ return m_count; }
			protected:
				void* GetBuffer();
			};
			typedef ISpellSearchListener Listener;
			//class SSBASE_API Listener:public internal::ISpellSearchListener{
			//public:
			//	virtual void OnResult(const int* ids, int ncount){}
			//};
			enum kEngineType{
				kEngineTypeRefactor,
				kEngineTypeMerged,
			};
		public:
			static void SelectEngine(kEngineType type);
			static void GetPinyinBuffer(const wchar_t* buffer, int len, wchar_t* quanbuf, int& quanlen, wchar_t* jianbuf, int& jianlen);
            static void GetAllKeys(std::vector<std::wstring>& keys);
            static void FindBonds(const std::wstring& text, Listener* listener);
			static void FindBonds(unsigned short const * text, int len, Listener* listener);
		};
	}
}
